SpringMVC 拦截器实现

本文介绍了一个具体的 Spring MVC 拦截器实现案例,包括如何通过拦截器进行登录验证并重定向未登录用户的流程。文章详细展示了 User3Controller 和 BookController 的代码,并深入分析了 AuthorInterceptor 的工作原理及遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写拦截器的事例出现了一个错误,找了很久,解决了问题就决定放上来。

首先是一个userController

package org.fkit.controller;

import javax.servlet.http.HttpSession;

import org.fkit.user.User3;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller 
public class User3Controller {
	@RequestMapping (value="/login")
	public ModelAndView login(String loginname,String password,ModelAndView mv,HttpSession session){
		if(loginname!=null&&loginname.equals("tyf")&&password!=null&&password.equals("123"))
		{
			User3 user=new User3();
			user.setLoginname(loginname);
			user.setPassword(password);
			user.setUsername("管理员");
			session.setAttribute("user", user);
			mv.setViewName("redirect:main");
		}
		else{
			mv.addObject("message", "登录名密码错误");
			mv.setViewName("loginForm");
		}
		return mv;
	}
}
登录页面loginForm.jsp

<form action="login" method="post">
    	<font color="red">${requestScope.message}</font><br>
    	登录名:<input type="text" name="loginname"><br>
    	密码:<input type="password" name="password"><br>
    	<input type="submit" value="登录">
    </form>
再是跳转到main action的控制器BookController

package org.fkit.controller;


import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller 
public class BookController {
	@RequestMapping (value="/main")
	public String main(Model model){
		return "main";
	}
}
关键的地方来了就是我们的拦截器部分

package org.fkit.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.fkit.user.User3;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class AuthorInterceptor implements HandlerInterceptor{
	private static final String [] IGNORE={"/loginForm","/login"};
	@Override
	public void afterCompletion(HttpServletRequest arg0,
			HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		System.out.println("AuthorInterceptor afterCompletion执行了");
		
	}

	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
			Object arg2, ModelAndView arg3) throws Exception {
		System.out.println("AuthorInterceptor postHandler执行了");
		
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
			Object handle) throws Exception {
		System.out.println("AutuorInterceprtor preHandle执行开始");
		boolean flag=false;
		String servletPath=request.getServletPath();
		for(String s:IGNORE)
			if(servletPath.contains(s))
			{
				flag=true;
				break;
			}
		if(!flag){
			User3 user=(User3)request.getSession().getAttribute("user");
			if(user==null){
				System.out.println("AuthorInteceptor拦截请求:");
				request.setAttribute("message","请先登录再访问");
				request.getRequestDispatcher("/WEB-INF/content/loginForm.jsp").forward(request, response);				
			}
			else{
				System.out.println("放行请求");
				flag=true;
			}
		}
		return flag;
	}
	
}

我出现的错误正是
request.getRequestDispatcher("/WEB-INF/content/loginForm.jsp").forward(request, response);

一开始只写了loginForm,浏览器解析不出,报了404,我是根据书本写的,不知道为什么会出这种错误。

springMVC的配置文件

<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/**"/>
			<bean class="org.fkit.interceptor.AuthorInterceptor"/>
		</mvc:interceptor>
	</mvc:interceptors>


main.jsp是获取登录权限之后可以进去的页面,如果我们没有登录就直接访问main会遭到拦截器的拦截,这正是拦截器的作用所在。


只有输入正确的账号密码才能看到main.jsp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值