Java Web知识梳理


一、Cookies

1. 特性

  • 数据信息存放在客户端浏览器上。
  • 单个保存的数据小于 4KB ,一个站点最多保存 20 个 Cookie
  • 对客户端是可见的,所以它是不安全的。
  • 可以通过设置 cookie 的属性,达到长期有效的效果。
  • 保管在客户端,不占用服务器资源,适合并发用户十分多的网站。

2. 存入

String userName = request.getParameter("username");

Cookie cookie1 = new Cookie("username", userName);
response.addCookie(cookie1);

3. 读取

String name = "";
Cookie[] cookies = request.getCookies();

if (cookies != null) {
    for (Cookie cookie1 : cookies) {
        if (cookie1.getName().equals("username")) {
            name = cookie1.getValue();
        }
    }
}

二、Session

1. 特性

  • 数据信息存放在服务器上。
  • 存储并没有上限,但出于对服务器端的性能考虑,不要存放过多的东西。
  • 依赖于名为 JSESSIONIDcookie ,而 JSESSIONID 的过期时间默认为 -1 ,当关闭窗口就会失效。
  • 保管在服务器端的,每个用户都会产生一个 session 。假如并发访问的用户十分多,会产生十分多的 session耗费大量的内存。

2. 写入

通过 getSession() 获取对象并存入数据。

User user = new User("123", "Alex", "male");
HttpSession session = request.getSession();
session.setAttribute("user", user);
3. 读取

通过getAttribute()读取到实体。

User user = (User) session.getAttribute("user");
if (entity != null) {
    out.println("Name:" + user.getName() + "<br>");
    out.println("Gender" + user.getGender() + "<br>");
}

三、过滤器

用于实现对登录用户的限制,如未登录不能访问主页面,权限不足无法访问部分页面,过滤逻辑方法体写在 doFilter() 方法中。

1. 登录过滤

通过过滤器对用户登录状态进行判断,如果未登录则跳转至登录页面,若已登录则放行。

@WebFilter("/*")
public class LoginFilter implements Filter {

    /**
      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
      */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
          throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        
        HttpSession session = req.getSession();
        Entity user = (Entity) session.getAttribute("User");
        String uri = req.getRequestURI();
        if(user != null || uri.contains("login")) {
            chain.doFilter(request, response);
        }else {
            req.getRequestDispatcher("/login.jsp").forward(req, resp);
        }
    }
}

2. 权限过滤

通过过滤器对用户权限进行判断,如果普通用户想访问管理员页面讲进行拦截。

@WebFilter("/manage.jsp")
public class ManageFilter implements Filter {

    /**
      * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
      */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
          throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;
        
        HttpSession session = req.getSession();
        Entity user = (Entity) session.getAttribute("User");
        if (user!= null && user.getRole()== 1) {
          chain.doFilter(request, response);
        } else {
          req.getRequestDispatcher("/index.jsp").forward(req, resp);
        }
    }
}

四、JSP、JSTL

1. 动作标签

通过标签实现在当前页面一显示其余页面内容。

(1) 页面一
<body>
    This is main page !
    <%
        int n = 10;
    %>
    
    <jsp:include page="Include.jsp">
        <jsp:param value="<%=n%>" name="n" />
    </jsp:include>

    This is main page !
</body>
(2) 页面二
<body>
    This is include page !
    <%
        int n = Integer.parseInt(request.getParameter("n"));
    %> 
    n=<%=n%>
    n^2=<%=n * n%>
</body>

2. 核心标签

<!-- 标签引用 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<body>
    <%
        User[] user = new User[3];
        user[0] = new User("张三", "男");
        user[1] = new User("李四", "女");
        user[2] = new User("王五", "男");

        request.setAttribute("user", user);
    %>
    
    <!-- requestScope:request对象的数据,利用EL表达式读取request中存的值 -->
    <!-- sessionScope:session对象的数据,利用EL表达式读取session中存的值 -->
    <c:forEach var="user" items="${requestScope.user}">
        <c:if test="${user.sex == ''}">
            <table>
                <tr>
                    <td>姓名:${user.name}</td>
                    <td>性别:${user.sex}</td>
                </tr>
            </table>
        </c:if>
    </c:forEach>
</body>

文章作者: 烽火戏诸诸诸侯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 烽火戏诸诸诸侯 !
  目录