示例【用户登录才能访问主页】
创建User
package com.po;
public class User {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
创建UserController
package com.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.po.User;
@Controller
public class UserController {
//跳转到登录页面
@RequestMapping("/loginForm")
public String loginForm() {
return "loginForm";
}
//用户登录
@RequestMapping("/login")
public String login(@ModelAttribute User user,HttpSession session) {
if(user.getUserName().equals("admin")&&user.getPassWord().equals("admin123")) {
session.setAttribute("user", user);
return "redirect:main";
}else {
return "loginForm";
}
}
//跳转到主页面
@RequestMapping("/main")
public String main() {
return "success";
}
}
创建UserLoginInterceptor
package com.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.po.User;
//拦截器必须实现HandlerInterceptor接口
public class UserLoginInterceptor implements HandlerInterceptor{
/**
* 该方法将在整个请求完成之后执行, 主要作用是用于清理资源的,
* 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("UserLoginInterceptor->afterCompletion()");
}
/**
* 该方法将在Controller的方法调用之后执行, 方法中可以对ModelAndView进行操作 ,
* 该方法也只能在当前Interceptor的preHandle方法的返回值为true时才会执行。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView arg3)
throws Exception {
System.out.println("UserLoginInterceptor->postHandle()");
}
/**
* preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
* 该方法的返回值为true拦截器才会继续往下执行,该方法的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("UserLoginInterceptor->preHandle");
// 不拦截"/loginForm"和"/login"请求
String url[]= {"/loginForm", "/login"};
String servletPath=request.getServletPath();
//获取请求的路径进行判断
for(String str:url) {
if(servletPath.contains(str)) {
return true;
}
}
User user=(User) request.getSession().getAttribute("user");
if(user==null) {
request.setAttribute("msg", "请先登录再访问本站");
request.getRequestDispatcher("loginForm").forward(request, response);
}
return true;
}
}
配置springmvc-config.xml
<!-- 使用注解驱动 -->
<mvc:annotation-driven />
<!-- 定义扫描的包 -->
<context:component-scan base-package="com.*" />
<mvc:resources location="/images/" mapping="/images/**"/>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp" />
</bean>
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/*"/>
<bean class="com.interceptor.UserLoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
创建loginForm.jsp
<h3>用户登录</h3>
${msg }
<form action="login" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="userName"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="passWord"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="登录"></td>
</tr>
</table>
</form>
创建success.jsp
<a>首页</a>|<a>订单</a>|<a>购物车</a>|<a>登录</a>|<a>注册</a>
<p>
<table width="300px" border="1">
<tr>
<th>序号</th>
<th>名称</th>
<th>图片</th>
</tr>
<tr>
<td>1</td>
<td>iPhone X</td>
<td><img src="images/iPhone X.jpg" height="50px"></td>
</tr>
<tr>
<td>2</td>
<td>vivo_nex</td>
<td><img src="images/vivo_nex.jpg" height="50px"></td>
</tr>
</table>
启动Tomcat访问:http://localhost:8080/jackson/main
输入正确用户、密码之后