12

我正在学习 Java Web,但我遇到了一些问题,需要帮助。我使用了一个 template.jsp,其中包含 header.jsp、footer.jsp、login.jsp(模板的左侧)和${param.content}.jsp. 对于每个名为 X.jsp 的页面,我制作了另一个具有以下内容的 jsp,因为我希望每个页面都具有相同的布局:

<jsp:include page="template.jsp">
    <jsp:param name="content" value="X"/>
    <jsp:param name="title" value="Start navigate"/>`enter code here`
</jsp:include>

例如,当我单击 Review 链接时,我想重定向到 Review.jsp,但我遇到了一些问题。在 footer.jsp 我有这样的事情:

(...)
< a href =" Review.jsp "> Review </a>
(...)

登录后,我尝试单击 Review,它将我发送到 Review.jsp,但它显示我没有登录。我使用 Spring Framework、Tomcat 7、Eclipse、MySQL。当我登录时,我创建了一个 cookie:

String timestamp = new Date().toString();
String sessionId = DigestUtils.md5Hex(timestamp);
db.addSession(sessionId, username, timestamp);
Cookie sid = new Cookie("sid", sessionId);
response.addCookie(sid);

对于每种方法,我都有类似的东西(我在教程中看到过):

@RequestMapping(value = "/writeReview", method = RequestMethod.GET)
public String nameMethod(@CookieValue("sid") String sid,...)

使用 sid,我可以找出谁是用户。我有一个包含用户帐户和其他一些表的数据库。问题是当我点击评论或任何其他时,它显示我没有登录。我该怎么办?

更新
我使用 JavaBean 作为用户和 login.jsp。具有登录文本框的 JSP,当我单击按钮登录时,我有一个 GET 方法。

@RequestMapping(value = "/login", method = RequestMethod.GET)
public ModelAndView createCookie(
  @RequestParam("username") String username, @RequestParam("password") String password,
  HttpServletRequest request, HttpServletResponse response) throws SQLException {
      //code for creating the cookie here, after testing if the user is in my database
}

对于每个页面,我发送 sid 并且我有一个模型属性,用户名:

public String methodName(@CookieValue(required = false) String sid, Model model) {
    if (sid != null) {
        User user = getUserBySid(sid);
        model.addAttribute("user", user);
    }
    (..other data.)
    return "nameJSP.jsp";
}

如果用户名不为空,我会检查每个 JSP,这就是我查看用户是否登录的方式。应用程序运行良好,如果我不单击页眉或页脚中的链接,它会传递参数。问题是我必须将一个参数从作为布局的实际内容的 JSP 传递给页脚引用的 JSP,这个 JSP 将是我布局的下一个内容。布局只识别内容和标题:

<title>${param.title}</title>
(I didn't paste all the code, I use a table <table>....)
<%@ include file="header.jsp"%>
<%@ include file="login.jsp"%>  
<jsp:include page="${param.content}.jsp"/> 
<%@ include file="footer.jsp"%>

那么如何在这个 JSP 中包含一个将从另一个 JSP 接收的参数呢?它还必须由 layout.jsp 访问并发送到页脚或页眉?

<jsp:include page="layout.jsp">
    <jsp:param name="content" value="X"/>
    <jsp:param name="title" value="Start navigate"/>
</jsp:include>
4

2 回答 2

15

将一些参数传递给包含的 JSP:

<jsp:include page="somePage.jsp" >
    <jsp:param name="param1" value="someValue" />
    <jsp:param name="param2" value="anotherParam"/>
    ....
</jsp:include>

你已经在做。

好的,问题的细节不是很清楚,但我明白了。
解决方案之一可能如下。

在您的Login操作中,如果身份验证成功,请创建HttpSession并为经过身份验证的User设置一个属性:

if (/* authentication was successfull */) {
    request.getSession().setAttribute("loggedInUser", user);
    ...
}

在您控制用户是否登录的代码中,只需检查是否存在适当的HttpSession属性:

HttpSession session = request.getSession(false);
if (session == null || session.getAttribute("loggedInUser") == null) {
    // user is not logged in, do something about it
} else {
    // user IS logged in, do something: set model or do whatever you need
}


或者在您的 JSP 页面中,您可以检查用户是否使用JSTL标签登录,如 BalusC 在此处的示例中所示:

...
<c:if test="${not empty loggedInUser}">
    <p>You're still logged in.</p>
</c:if>
<c:if test="${empty loggedInUser}">
    <p>You're not logged in!</p>
</c:if>
...

过滤器来拯救

但通常,您检查用户是否登录以限制对某些页面的访问(因此只有经过身份验证的用户才能访问它们)。你编写了一些实现 javax.servlet.Filter的类。

这是我的一个项目中的 LoginFilter 示例:

package com.example.webapp.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

/**
 * The purpose of this filter is to prevent users who are not logged in
 * from accessing confidential website areas. 
 */
public class LoginFilter implements Filter {

    /**
     * @see Filter#init(FilterConfig)
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;

        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("loggedInUser") == null) {
            response.sendRedirect(request.getContextPath() + "/login.jsp");
        } else {
            chain.doFilter(request, response);
        }
    }


    /**
     * @see Filter#destroy()
     */
    @Override
    public void destroy() {}

}

在这个项目中,我使用了没有 Spring 的普通 servlet 和 JSP,但你会明白的。

当然,您必须配置web.xml才能使用此过滤器:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    ...
    <filter>
        <filter-name>Login Filter</filter-name>
        <filter-class>com.example.webapp.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>Login Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    ...
</web-app>


注意
如果您使用支持 Servlet 3.0 及更高版本的Web 容器应用程序服务器,则可以使用@WebFilter注释来注释过滤器类,在这种情况下,无需在部署描述符( web.xml )中配置过滤器. 在此处查看使用@WebFilter注释和更多过滤器相关信息的示例。

希望这会帮助你。

于 2013-01-03T09:46:14.960 回答
-1

或者只是使用:

String username = request.getRemoteUser();
于 2015-12-30T14:46:40.237 回答