场景:
我现在有个登录页面,登录成功之后跳到管理页面。如果我现在直接绕过登录页面页面,那是不是会很不安全?所以我们就要判断用户是否有绕过登录的权限。做权限判断的3种方法:
在页面使用session做判断
Login.jsp
Servlet.java
功能:如果匹配帐号成功则分配一个session
import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * Servlet implementation class DemoServlet */@WebServlet("/DemoServlet")public class DemoServlet extends HttpServlet { PRivate static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public DemoServlet() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 先判断一个当前有没有session,如果有session就不用再登录了,直接跳转到管理页面 // 获取到当前用户的session HttpSession session = request.getSession(); String username = request.getParameter("username"); String password = request.getParameter("password"); if (username.equals("admin") && password.equals("123456")) { // 用户登录成功,我们在服务器端给session设置一个属性 session.setAttribute("isLogin", "yes"); session.setAttribute("username", username); //判断用户有没有选中“记住我”,如果需要记住的话,服务端写一个cookie到客户端 if(request.getParameter("rememberMe") != null){ Cookie cookie = new Cookie("username",username); response.addCookie(cookie); } request.getRequestDispatcher("admin/manager.jsp").forward(request, response); } else { if (session.getAttribute("username") == null) { // 如果当前的用户的一个属性username为null,说明这个用户还没登录过, // 重定向(跳转)到用户登录页 response.sendRedirect("login.jsp"); } else { // 如果用户已经登录过,就跳转到管理页 request.getRequestDispatcher("admin/manager.jsp").forward(request, response); } } //response.getWriter().append("Hello world!"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}登录成功之后的manager.jsp
页面
session.getAttribute(“username”) 为空 ,表示用户在登录的时候是失败的,并没有servlet分配给用户的session,所以这时候
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% //让一个页面不被非登录用户访问的方法是,在页面里做session的判断 if(session.getAttribute("username") == null){ System.out.println("转发请求到../login.jsp"); response.sendRedirect("../login.jsp"); } //String username = (String)session.getAttribute("username"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Insert title here</title></head><body>管理员页面!</body></html>场景:
如果用session做权限判断时会有很多页面,这时我们就要在每个页面都写上session判断,为了减少代码的冗余,我们可以单独创建一个页面专门处理session逻辑创建一个空页面专门处理session的判断逻辑,其他页面运行的时候将这个空页面包涵进来即可
checkLogin.jsp
在manager.jsp
将checkLogin.jsp
包涵进来即可 <%@ include file=”checkLogin.jsp” %>
在线API文档:
http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/Filter.html
Filter是Java web过滤器
Filter常用的场景
1) Authentication Filters 权限过滤器2) Logging and Auditing Filters 日志和审计过滤器3) Image conversion Filters 图片转换过滤器4) Data compression Filters 数据转换5) Encryption Filters 加密6) Tokenizing Filters 词法分析7) Filters that trigger resource access events 资源访问事件触发过滤器8) XSL/T filters xsl/t9) Mime-type chain Filter 文件类型链过滤器常用的类Filter
javax.servlet.Filter初始化方法init
public void init(FilterConfig fConfig) throws ServletException { // TODO Auto-generated method stub}销毁方法destroy
public void destroy() { // TODO Auto-generated method stub}过滤方法体doFilter
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { chain.doFilter(request, response);}填写类名,过滤的目录
项目结构
LoginFilter.java
当直接访问admin/manager.jsp 的时候,过滤器会自动拦截掉
新闻热点
疑难解答