使用SpringMVC的拦截器实现登陆控制

使用SpringMVC的拦截器实现登陆控制

  • 当用户没有登陆时,不能访问任何其他的页面,登录之后可以

1、 配置 web.xml

  • 所有的请求都由 springmvc 来控制分发

<web-app version="3.1"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee                       
	http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">

	
	<servlet>
		<servlet-name>springmvcservlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
		<init-param>
			<param-name>contextConfigLocationparam-name>
			<param-value>classpath:springmvc.xmlparam-value>
		init-param>
		<load-on-startup>1load-on-startup>
	servlet>

	<servlet-mapping>
		<servlet-name>springmvcservlet-name>
		<url-pattern>/url-pattern>
	servlet-mapping>
	
	
	<filter>
		<filter-name>encodingfilter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
		<init-param>
			<param-name>encodingparam-name>
			<param-value>utf-8param-value>
		init-param>
	filter>
	
	<filter-mapping>
		<filter-name>encodingfilter-name>
		<url-pattern>/*url-pattern>
	filter-mapping>

web-app>

2、配置 springmvc.xml 全局配置文件

  • 此拦截器,会拦截任何请求
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

	<!-- 配置注解扫描器 -->
	<context:component-scan
		base-package="com.mak.controller"></context:component-scan>

	<!-- 注解驱动 相当于配置了解析器和适配器 -->
	<mvc:annotation-driven></mvc:annotation-driven>

	<!-- 放行静态资源 -->
	<mvc:resources location="/js/" mapping="/js/**"></mvc:resources>
	<mvc:resources location="/css/" mapping="/css/**"></mvc:resources>
	<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
	<mvc:resources location="/files/" mapping="/files/**"></mvc:resources>

	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/page/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 配置拦截器 -->
	<mvc:interceptors>
		<bean class="com.mak.interceptor.LoginInterception"></bean>
	</mvc:interceptors>

</beans>

3、 登陆页面

	<form action="login" method="post">
		用户名:<input type="text" name="username" /><br /> 
		密码:<input type="password" name="password" /><br /> 
		<input type="submit" value="登录" />
	</form>

4、用户实体

public class Users {

	private int id;
	private String username;
	private String password;
	...

5、登录之后的其他页面,放在 / WEB-INF / page 中
使用SpringMVC的拦截器实现登陆控制_第1张图片
6、拦截器

当有请求时,会先执行 preHandler 方法,最外面 URI 的比较是当第一次登录时,如果没有这个比较,第一次登录时,登录请求被拦截,此时 session 中肯定没有用户,没有用户就又会回到登陆页面,就无法登录。所以提出来单独解决。其他情况下就会判断 session 中是否有用户,没有就返回登录页面继续登录,有的话返回 true。此时才会执行 login 控制器。

public class LoginInterception implements HandlerInterceptor {
	@Override
	public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
		if (arg0.getRequestURI().equals("/springmvc/login")) {
			return true;
		} else {
			if (arg0.getSession().getAttribute("users") != null) {
				return true;
			} else {
				arg1.sendRedirect("/springmvc08/login.jsp");
				return false;
			}
		}
	}
	
	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
	}
	@Override
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
			throws Exception {
	}
}

7、控制器

login 控制器中就判断用户名密码是否正确(这里用户名密码写死了,可以从数据库中取数据比较),不正确继续登录,正确跳转到 main.jsp 页面,这里返回 mian 是由于 springmvc.xml 中配置了视图解析器,此时就可以访问任何页面了。前面的 mian 方法使用了 restful 风格,使一个方法可以实现任何页面的跳转,请求哪个页面返回哪个页面(在登陆的前提下,并且这些页面都在WEB-INF/page下,因为视图解析器是这样配的,也可以变)

@Controller
public class DemoController {

	@RequestMapping("{page}")
	public String main(@PathVariable String page) {
		return page;
	}
	
	@RequestMapping("login")
	public String login(Users users, HttpSession session) {
		if (users.getUsername().equals("admin") && users.getPassword().equals("123")) {
			session.setAttribute("users", users);
			return "main";
		}else {
			return "redirect:/login.jsp";
		}
	}

}

你可能感兴趣的:(#,SpringMVC)