看到好多网站都有这么一个功能,就是没登陆的时候,有些页面是可以查看的,但是必须要登陆才能进行操作,很多朋友在开发过程中为防止这样的事情发生也许会做一个提示框,或直接将用户界面重定向到登陆界面,其实这两种的用户用户体验效果都不是很好,其实,用户想操作,我们需要用户登陆,这是没问题的,问题就是我们在处理完用户登陆后,能继续让用户之前的操作流转下去呢,这种实现方式我感觉更好,当然很多网站也都这么实现的,下面我们来简单实现以下。
1、首先一个过滤器,对非法的操作进行拦截,同时保存当前的请求。
package com.lyl.servlet; import java.io.IOException; import java.util.Arrays; import java.util.List; 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; public class LoginFilter implements Filter { private String [] urls; @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest)request; String url=req.getRequestURI(); System.out.println("url==="+url); System.out.println("contextPath=="+ req.getContextPath()); url=url.replace(req.getContextPath()+"/", ""); List<String> urlList= Arrays.asList(urls); if(!urlList.contains(url)){ Object o=req.getSession().getAttribute("user"); if(o !=null){ chain.doFilter(request, response); }else{ if(req.getQueryString() !=null) url=url+"?"+req.getQueryString(); req.setAttribute("reqURL",url); req.getRequestDispatcher("/login.jsp").forward(request, response); } }else{ chain.doFilter(request, response); } } @Override public void init(FilterConfig config) throws ServletException { System.out.println("--------------------Filter进行了初始化------------------"); String urlStr=config.getInitParameter("noInterruptUrl"); urls=urlStr.split(","); } @Override public void destroy() { System.out.println("--------------------Filter进行了销毁------------------"); } }
2、登陆成功方法后续处理:如果之前的请求路径不为空,转发到之前的页面。
package com.lyl.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 4488742375496278371L; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { this.doPost(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String userName=req.getParameter("userName"); String password=req.getParameter("password"); User user=new User(); user.setUserName(userName); user.setPassword(password); String reqURL=req.getParameter("reqURL"); req.getSession().setAttribute("user", user); String dispatcher="bidding.jsp"; //如果登录页面保存之前的请求路径不为空,取出之前的请求路径,转发到之前的请求页面 if(reqURL !=null && !"".equals(reqURL)){ dispatcher=reqURL; } req.getRequestDispatcher("/"+dispatcher).forward(req, resp); } }
3、web.xml中配置需要不需要拦截的路径,过滤器初始化操作的时候,进行取值。
<filter> <filter-name>loginFilter</filter-name> <filter-class>com.lyl.servlet.LoginFilter</filter-class> <init-param> <param-name>noInterruptUrl</param-name> <param-value>login.jsp,login.do,bidding.jsp</param-value> </init-param> </filter>
说白了其实原理很简单,进行非登录拦截的时候,顺便存下之前的请求路径,在后面登陆成功后,转发到之前是请求路径就ok了,有兴趣的朋友可以试下,附上源代码。
相关推荐
本篇文章将深入探讨如何在Flask中使用session来保存登录状态,并实现拦截未登录用户的请求。 1. **理解Session** Session是一种在服务器端存储用户状态的方法,通常用于存储用户的登录状态。当用户成功登录后,...
4. **处理重定向**:在拦截器的`intercept()`方法中,当登录成功时,我们获取并返回存储的原始URL,Struts2会自动进行重定向操作。如果登录失败,则按正常流程返回Action的结果。 通过这样的设置,Struts2的拦截器...
优化可能包括减少不必要的拦截操作,或者采用缓存技术提高性能。 通过这样的方式,Jfinal的拦截器机制可以帮助我们实现精细的权限控制,确保只有经过验证的用户才能访问特定资源。同时,拦截器的灵活性让我们可以...
而Interceptor则更适用于Spring MVC环境中,它可以针对特定的Controller方法进行拦截,例如进行权限检查、操作日志记录等。 将这四个技术整合在一起,我们可以构建一个安全且具有实时交互功能的Web应用。具体步骤...
axios的http拦截器允许我们在请求发送前或响应返回后添加额外的操作。例如,我们可以在请求拦截器中添加token,确保每个API调用都携带认证信息。而在响应拦截器中,我们可以处理服务器返回的错误,如自动重定向到...
总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...
在这个项目中,开发者充分利用了SSM的优势,实现了数据操作的基本功能,包括增删改查、分页查询,以及用户身份验证和登录拦截,这些都是Web应用中的核心功能模块。 首先,增删改查(CRUD)是数据库操作的基础,...
- 在 `intercept` 方法中,首先获取请求的URL,然后检查是否是登录(`login.action`)或注销(`logout.action`)操作,如果是则直接调用 `ai.invoke()` 继续执行后续操作。 - 验证Session是否有效,如果Session ID无效...
`request.js`是请求拦截和数据封装的主要入口,而`auth.js`则负责处理token相关的操作,如获取、设置和移除token以及判断用户是否已登录。 在`auth.js`中,我们定义了四个函数: 1. `isLogin()`:检查本地存储中...
在用户成功登录后,服务器会返回一个会话标识(如JWT),前端保存此标识并在后续请求中携带。后端通过这个标识来识别用户并检查其权限。 4. **ExtJS的Ajax请求和数据绑定** ExtJS的Ajax请求(如`Ext.Ajax.request`...
拦截器是面向切面编程(AOP)的一个重要概念,它允许在方法或字段被访问之前或之后插入额外的操作。这提供了一种灵活的方式,可以在不修改原有代码的情况下,增强或控制程序的行为。在Web开发框架如Struts 2中,拦截...
本项目是基于Spring Boot和Spring Session,结合Redis存储,实现了一个登录拦截功能,确保了在分布式状态下的Session一致性。 Spring Session是Spring框架的一个扩展,它允许我们将用户的Session数据存储在外部存储...
拦截器(Interceptor)是Spring MVC中的一种拦截请求的方式,可以用来在请求到达控制器之前进行一系列操作。SpringBoot拦截器可以用来进行权限验证、解决乱码问题、记录操作日志、性能监控、异常处理等。 首先,...
在Vue应用程序中,实现登录验证成功后保存和管理token的操作是确保用户会话安全和持久的重要步骤。通常,服务器在用户成功登录后会返回一个令牌(如JWT,JSON Web Token),这个令牌用于后续的API请求,以验证用户的...
此外,你可能还需要使用`chrome.storage`API来保存和恢复设置,`chrome.runtime`API来与背景脚本通信,或者`chrome.tabs`API来操作当前激活的Tab。 在开发过程中,记得使用`chrome://extensions`页面开启"开发者...
这个Demo展示了如何在Android系统中实现这种高级功能,它能够在其他安全软件如360安全卫士、豌豆荚等之前优先进行拦截操作。在深入探讨这个Demo之前,我们先来了解一下短信和电话拦截的基本原理及其在Android平台上...
3. 激活规则:保存规则后,只要满足设置的条件,插件就会自动拦截并替换相应请求的响应内容。 4. 监控效果:可以通过浏览器的开发者工具(F12键打开)查看请求和响应,确认规则是否生效。 在压缩包文件“Resource ...
在探讨vue-resource请求实现登录拦截和路由拦截的方法之前,首先需要了解几个关键的技术点,它们分别是:前后端分离架构、登录状态的存储与验证、路由守卫以及HTTP请求拦截器。接着,将详细阐述如何使用vue-resource...
2. **驱动级拦截**:通过编写驱动程序,直接在操作系统层面拦截网络数据包,如Winpcap和Wireshark。 3. **浏览器插件**:利用浏览器提供的API,如Firefox的GreaseMonkey或Chrome的Tamper Data,可以在浏览器内部...