`
星夜的遐想
  • 浏览: 189445 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

拦截非登录操作,保存请求

 
阅读更多

看到好多网站都有这么一个功能,就是没登陆的时候,有些页面是可以查看的,但是必须要登陆才能进行操作,很多朋友在开发过程中为防止这样的事情发生也许会做一个提示框,或直接将用户界面重定向到登陆界面,其实这两种的用户用户体验效果都不是很好,其实,用户想操作,我们需要用户登陆,这是没问题的,问题就是我们在处理完用户登陆后,能继续让用户之前的操作流转下去呢,这种实现方式我感觉更好,当然很多网站也都这么实现的,下面我们来简单实现以下。

 

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保存登录状态及拦截未登录请求代码

    本篇文章将深入探讨如何在Flask中使用session来保存登录状态,并实现拦截未登录用户的请求。 1. **理解Session** Session是一种在服务器端存储用户状态的方法,通常用于存储用户的登录状态。当用户成功登录后,...

    Struts通过拦截器实现登录后跳转到登录前页面

    4. **处理重定向**:在拦截器的`intercept()`方法中,当登录成功时,我们获取并返回存储的原始URL,Struts2会自动进行重定向操作。如果登录失败,则按正常流程返回Action的结果。 通过这样的设置,Struts2的拦截器...

    Jfinal通过拦截器实现登录验证

    优化可能包括减少不必要的拦截操作,或者采用缓存技术提高性能。 通过这样的方式,Jfinal的拦截器机制可以帮助我们实现精细的权限控制,确保只有经过验证的用户才能访问特定资源。同时,拦截器的灵活性让我们可以...

    springboot + jwt + websocket + 拦截

    而Interceptor则更适用于Spring MVC环境中,它可以针对特定的Controller方法进行拦截,例如进行权限检查、操作日志记录等。 将这四个技术整合在一起,我们可以构建一个安全且具有实时交互功能的Web应用。具体步骤...

    Vue全家桶axios前端实现登录拦截登出拦截器等功能

    axios的http拦截器允许我们在请求发送前或响应返回后添加额外的操作。例如,我们可以在请求拦截器中添加token,确保每个API调用都携带认证信息。而在响应拦截器中,我们可以处理服务器返回的错误,如自动重定向到...

    Struts拦截器案例——登陆

    总结起来,这个"Struts拦截器案例——登陆"涵盖了Struts2拦截器的基本使用、登录验证、数据库操作以及异常处理等多个方面。通过学习这个案例,开发者可以更好地理解和掌握Struts2框架中的拦截器机制,从而在实际项目...

    ssm框架增删改查、分页查询、验证登录、登陆拦截

    在这个项目中,开发者充分利用了SSM的优势,实现了数据操作的基本功能,包括增删改查、分页查询,以及用户身份验证和登录拦截,这些都是Web应用中的核心功能模块。 首先,增删改查(CRUD)是数据库操作的基础,...

    简单的struts2拦截器利用session拦截用户登录.docx

    - 在 `intercept` 方法中,首先获取请求的URL,然后检查是否是登录(`login.action`)或注销(`logout.action`)操作,如果是则直接调用 `ai.invoke()` 继续执行后续操作。 - 验证Session是否有效,如果Session ID无效...

    Vue实现数据请求拦截

    `request.js`是请求拦截和数据封装的主要入口,而`auth.js`则负责处理token相关的操作,如获取、设置和移除token以及判断用户是否已登录。 在`auth.js`中,我们定义了四个函数: 1. `isLogin()`:检查本地存储中...

    extjs实现权限拦截

    在用户成功登录后,服务器会返回一个会话标识(如JWT),前端保存此标识并在后续请求中携带。后端通过这个标识来识别用户并检查其权限。 4. **ExtJS的Ajax请求和数据绑定** ExtJS的Ajax请求(如`Ext.Ajax.request`...

    理解拦截器用于在某个方法或字段被访

    拦截器是面向切面编程(AOP)的一个重要概念,它允许在方法或字段被访问之前或之后插入额外的操作。这提供了一种灵活的方式,可以在不修改原有代码的情况下,增强或控制程序的行为。在Web开发框架如Struts 2中,拦截...

    springboot 项目,基于springsession整合redis实现登录拦截功能

    本项目是基于Spring Boot和Spring Session,结合Redis存储,实现了一个登录拦截功能,确保了在分布式状态下的Session一致性。 Spring Session是Spring框架的一个扩展,它允许我们将用户的Session数据存储在外部存储...

    SpringBoot拦截器实现登录拦截的方法示例

    拦截器(Interceptor)是Spring MVC中的一种拦截请求的方式,可以用来在请求到达控制器之前进行一系列操作。SpringBoot拦截器可以用来进行权限验证、解决乱码问题、记录操作日志、性能监控、异常处理等。 首先,...

    Vue中登录验证成功后保存token,并每次请求携带并验证token操作

    在Vue应用程序中,实现登录验证成功后保存和管理token的操作是确保用户会话安全和持久的重要步骤。通常,服务器在用户成功登录后会返回一个令牌(如JWT,JSON Web Token),这个令牌用于后续的API请求,以验证用户的...

    定制自己的Chrome DevTools调试工具,拦截页面请求

    此外,你可能还需要使用`chrome.storage`API来保存和恢复设置,`chrome.runtime`API来与背景脚本通信,或者`chrome.tabs`API来操作当前激活的Tab。 在开发过程中,记得使用`chrome://extensions`页面开启"开发者...

    短信和电话拦截Demo

    这个Demo展示了如何在Android系统中实现这种高级功能,它能够在其他安全软件如360安全卫士、豌豆荚等之前优先进行拦截操作。在深入探讨这个Demo之前,我们先来了解一下短信和电话拦截的基本原理及其在Android平台上...

    谷歌插件Resource Override,可以拦截请求替换内容

    3. 激活规则:保存规则后,只要满足设置的条件,插件就会自动拦截并替换相应请求的响应内容。 4. 监控效果:可以通过浏览器的开发者工具(F12键打开)查看请求和响应,确认规则是否生效。 在压缩包文件“Resource ...

    vue-resource请求实现http登录拦截或者路由拦截的方法

    在探讨vue-resource请求实现登录拦截和路由拦截的方法之前,首先需要了解几个关键的技术点,它们分别是:前后端分离架构、登录状态的存储与验证、路由守卫以及HTTP请求拦截器。接着,将详细阐述如何使用vue-resource...

    WEB封包拦截源码

    2. **驱动级拦截**:通过编写驱动程序,直接在操作系统层面拦截网络数据包,如Winpcap和Wireshark。 3. **浏览器插件**:利用浏览器提供的API,如Firefox的GreaseMonkey或Chrome的Tamper Data,可以在浏览器内部...

Global site tag (gtag.js) - Google Analytics