**
登录:
**
代码:
@Controller
public class LoginController {
//@RequestMapping(value = "/user/login",method = RequestMethod.POST)
// @DeleteMapping 处理不同请求
// @PutMapping
// @GetMapping
@PostMapping("/login")
public String loginController(@RequestParam("username") String name,@RequestParam String password,Map<String,Object> map){//表明参数是从请求中获取,如果没有就会报错
//不连接数据库,简单判断
if(!StringUtils.isEmpty(name)&&password.equals("12345")){
return "dashboard"; //请求转发
}else{
map.put("mesg","用户密码错误");
return "index";
}
}
}
注意的地方:
@Controller
方法的参数,传入的参数和你要传回的参数
在页面的action 中设置数据传送的服务端,url 应该是/xx 而不能是:/xx/xxx 多级的url . 多级的url 前面会被默认为项目名。如果没有在配置文件中设置过项目名。在返回数据的时候一些在类路径下的资源就会找不到
例如:index.html th: action=@{/user/login} 如果执行完处理数据之后返回index.html 在类路径下的静态资源就找不到
开发技巧:
如何让你的模板引擎页面修改后能够实时生效:修改配置;禁用模板缓存spring.thymeleaf.cache=false;改完代码之后:ctrl+f9重新编译
登陆之后转到dashboard.html 页面使用的是请求转发,如果进行刷新表单就会重复提交;如果设置为重定向;
//在SpringMVC 的扩展配置类中,增加视图映射
registry.addViewController("/user.html").setViewName("dashboard");//ViewName 会被thymeleaf 解析
在@Controller 中:
重定向:return “redirect:/user.html”
但是重定向,会导致只要访问的url =/user,html 用户的页面就会被访问
所以要设置拦截器,拦截不合理的访问
**
拦截器
**
进行登录检查
==要实现拦截器;实现 HandlerInterceptor
拦截器:
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// return false;
//检查session 域中是否有name
Object user = request.getSession().getAttribute("loginuser");
if(user==null){
//未登录,回到登陆页面
//传回错误信息
request.setAttribute("mesg","没有权限请登录");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else {
//已经登陆,放行
return true;
}
}
将拦截器配置到SpringMVC 中:
//设置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
// super.addInterceptors(registry);
//页面在访问的时候也会访问静态资源;*.css *.js
// 但是springBoot 已经做好了静态资源映射,所以在spring boot 中可以不用考虑
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/","/index.html","/login");
}
遇见一个问题:静态资源的访问会被拦截:springboot2.x 底层依赖的是spring 5 静态资源会被自定义的拦截器拦截,spring boot1.5 底层依赖的是spring 4,静态资源是不被拦截的https://blog.csdn.net/ln1593570p/article/details/80607616
解决办法:在配置文件中配置静态资源的映射,在设置拦截的时候,排除静态资源
静态资源的默认路径:/**(不用加static),设置配置文件:spring.mvc.static-path-pattern=
如果设置静态资源的访问路径没有用,那就排除对"/asserts/**"的拦截