一、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. 特性
- 数据信息存放在服务器上。
- 存储并没有上限,但出于对服务器端的性能考虑,不要存放过多的东西。
- 依赖于名为
JSESSIONID
的cookie
,而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>