public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=utf-8"); // 得到用户请求的URI // 得到web应用程序的上下文路径 // 去除上下文路径,得到剩余部分的路径 String uri = req.getRequestURI().substring(req.getContextPath().length());//请求的页面 String url=req.getHeader("referer");//之前的页面 if(req.getSession().getAttribute("patient")==null&&patient.contains(uri)){ req.getSession().setAttribute("message","请先登录!"); req.getSession().setAttribute("url",url); // System.out.println(req.getSession().getAttribute("url")); HttpServletResponse resp= (HttpServletResponse) servletResponse; resp.sendRedirect("login.jsp"); }else { filterChain.doFilter(servletRequest, servletResponse); } }
时间: 2024-02-07 21:02:20 浏览: 85
这个过滤器的 doFilter() 方法是过滤器的核心方法,用于对请求进行过滤和拦截。该方法接收一个 ServletRequest 对象、一个 ServletResponse 对象和一个 FilterChain 对象作为参数。
在该方法中,首先将 ServletRequest 对象强制转换为 HttpServletRequest 对象,然后设置请求和响应的字符编码为 utf-8,并设置响应的内容类型为 text/html;charset=utf-8,以保证中文字符能够正确显示。
接着,通过 HttpServletRequest 对象获取用户请求的 URI,并去除上下文路径,得到剩余部分的路径。然后,通过 HttpServletRequest 对象获取请求头中的 referer 字段,即之前的页面。
接下来,进行判断:如果用户未登录且请求的 URI 在 patient 列表中,则将一个提示信息和之前的页面的 URL 存放在 HttpSession 对象中,并进行页面的重定向,跳转到登录页面(login.jsp);否则,将请求和响应对象传递给 FilterChain 对象的 doFilter() 方法,继续执行后续的过滤器。
相关问题
解释一下 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req =(HttpServletRequest) request; HttpServletResponse resp =(HttpServletResponse) response; HttpSession session = req.getSession(); User user =(User) session.getAttribute("user"); String uri= req.getRequestURI(); if(user==null&&!uri.endsWith("login")&&!uri.endsWith("login.jsp")) { String path = req.getServletContext().getContextPath(); System.out.println(path); resp.sendRedirect(path+"/client/login.jsp"); } else{ chain.doFilter(request, response); } }
这段代码是一个 Java Web 应用程序中的过滤器,用于过滤客户端请求。在客户端请求被处理之前,它会拦截请求并检查当前用户是否已经登录。如果用户未登录,则会将请求重定向到登录页面。否则,请求将继续被处理,直到响应返回给客户端。具体来说,代码中的 doFilter 方法会获取当前请求的 HttpServletRequest 和 HttpServletResponse 对象,然后从 HttpServletRequest 对象中获取 HttpSession 对象和当前登录的用户信息。如果用户未登录且请求不是登录页面或登录请求,则将请求重定向到登录页面。否则,将请求和响应对象传递给 FilterChain 对象的 doFilter 方法,以便继续处理该请求。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; HttpSession session = req.getSession(false); String path = req.getRequestURI().substring(req.getContextPath().length()).replaceAll("[/]+$", ""); boolean loggedIn = (session != null && session.getAttribute("account") != null); boolean allowedPath = ALLOWED_PATHS.contains(path); if (loggedIn || allowedPath) { chain.doFilter(req, res); } else { String script = "<script>location.href='login/login.jsp';alert('还未登录,请登录!')</script>"; res.getWriter().println(script); } }
这是一个 Java Web 中的过滤器(Filter),用于拦截用户的请求并进行权限控制。该过滤器的作用是:如果用户未登录且访问的不是允许访问的路径,则重定向到登录页面并提示用户进行登录。如果用户已经登录或访问的是允许访问的路径,则继续执行后续操作。
具体实现逻辑如下:
1. 首先获取请求的 HttpServletRequest 对象和响应的 HttpServletResponse 对象。
2. 通过 HttpServletRequest 对象获取用户的 Session 对象,判断用户是否已经登录。
3. 获取请求的路径,并判断该路径是否在允许访问的路径列表 ALLOWED_PATHS 中。
4. 如果用户已经登录或请求的路径是允许访问的路径,则继续执行后续操作,即调用 FilterChain 对象的 doFilter 方法,将请求和响应对象传递给下一个过滤器或 Servlet。
5. 如果用户未登录且请求的路径不是允许访问的路径,则重定向到登录页面并提示用户进行登录。具体实现是通过 HttpServletResponse 对象的 getWriter 方法获取响应输出流,并输出一段 JavaScript 代码,将页面重定向到登录页面并弹出提示框。
该过滤器的实现可以有效地保护 Web 应用程序的安全性,防止非法用户进行未授权的访问。
阅读全文