JDK1.7+Tomcat7.0+Eclipse+SSM
了解:400
当我在URL栏填写后按"回车键"后,页面报错:400,但是Eclipse的控制台没有报异常!!!!
原因:index2()方法的参数使用了注解@CookieValue(),而注解获取的值为空,导致返回不到页面的输入框
1、我的“Cookie”相关的代码
我的EmpVo:
我的EmpService,实际上就是EmpDAO接口类的实现类:
我的login.jsp:
我的LoginController( 含 传统获取Cookie的index2()、使用注解获取Cookie的index3() ):
@RequestMapping("/user")
public class LoginController {
//注入服务,进行数据库操作
@Resource
EmpService empService;
//有index3()方法,可以不用index2(),要是报了400,还是使用传统方法获取Cookie的index2()
// @RequestMapping(value="/login",method=RequestMethod.GET)
public String index2(HttpServletRequest request,ModelMap modelmap){
/**
* ModelAndView(传参数和路径)
* 1.返回页面的参数可以通过addObject方法进行设置,相当于调用request.setAttribue方法
* 2.返回页面的URL可以通过setViewName方法设置,但是必须注意的是,页面文件必须与调用的URL地址一致
* 3.ModelAndView一般在方法的内部定义
* 4.方法的返回值必须为ModelAndView
*
* ModelMap(只传路径)
* 1.返回页面的参数可以通过addAttribute方法进行设置,相当于调用request.setAttribue方法
* 2.ModelMap变量一般在方法的参数中定义
* 3.方法的返回值是字符串
* */
// EmpVo empvo=new EmpVo();
// modelmap.addAttribute("emp",empvo);
//设置返回页面
Cookie ck[]=request.getCookies();
if(ck!=null){//判断cookie是否存在
for(int i=0;i<ck.length;i++){
if(ck[i].getName().equals("unameCookie")){
//URLDecoder.decode方法解码,确保中文不会出现乱码
//通过addAttribute方法定义的变量,相当于request.setAttribute定义的变量
modelmap.addAttribute("empName",URLDecoder.decode(ck[i].getValue()));
}
if(ck[i].getName().equals("pwdCookie")){
modelmap.addAttribute("password",URLDecoder.decode(ck[i].getValue()));
}
}
}
return "login";
}
//get方式请求,执行index方法
/**
* index2()是传统获取cookie
* 使用注解获取Cookie的index3()比index2(),简洁简单,系统自动编码解码
*
* 从系统中获取cookie值,使用@CookieValue注解
* (定义Cookie还是使用传统的做法,因为要自定义设置有效期啥的,所以没有定义Cookie的注解,但获取Cookie有注解且可以使用)
* 语法
* 把名称为unameCookie的cookie的值取出来赋值给empName变量
* @CookieValue("unameCookie") String empName
* 把名称为pwdCookie的cookie的值取出来赋值给password变量
* @CookieValue("pwdCookie") String password
* */
@RequestMapping(value="/login",method=RequestMethod.GET)
public String index3(@CookieValue("unameCookie") String empName,@CookieValue("pwdCookie") String password,ModelMap map){
System.out.println("empName___"+empName+" password___"+password);
map.addAttribute("password", password);
map.addAttribute("empName", empName);
return "login";
}
@RequestMapping(value="/login",method=RequestMethod.POST)
public String login(HttpServletRequest request,HttpServletResponse response){
String name=request.getParameter("empName");
String pwd=request.getParameter("password");
String rmbPwd=request.getParameter("rmbPwd");
System.out.println("empName="+name+",password="+pwd+",rmbPwd="+rmbPwd);
EmpVo emp=new EmpVo();
emp.setEmpName(name);
emp.setPassword(pwd);
/**
* Cookie的使用,
* 创建Cookie是为了"login成功前勾选'记住密码'的话,就会记住name与password(注意编码转换),重新登录无需重写"
* 则先在登录成功即将返回"mainFrame"页面前去控制
* 再回到GET方法的index方法,若有Cookie,读取Cookie信息(注意 解码),否则无需读取
* 注:可以定时:一天之内记住密码
*/
if(empService.login(emp)){//用户名和密码有对应记录就到mainFrame页面,否则返回login页面
/**
* 保存cookie
* 用URLEncoder.encode方法进行编码处理
* */
if(rmbPwd!=null){//判断记住密码是否存在
Cookie uck=new Cookie("unameCookie",URLEncoder.encode(name));
Cookie pck=new Cookie("pwdCookie",URLEncoder.encode(pwd));
//有效时间为一天(最小单位是秒)
uck.setMaxAge(60*60*24);
pck.setMaxAge(60*60*24);
//设置保存路径
uck.setPath(request.getContextPath());
pck.setPath(request.getContextPath());
//给response
response.addCookie(uck);
response.addCookie(pck);
}
//登录成功后进入管理中心主页面
return "mainFrame";
}else{
//定义登录失败的request提示变量
request.setAttribute("msg", "未注册,若注册了,则请重新判断用户名或密码是否有误!!!!!!!!!!");
return "login";
}
}
}
我的mainFrame页面:
2.为什么会报400
登录login使用Cookie,昨天早上"点击记住密码"即创建Cookie,设置有效期为一天,按理今天早上,Cookie已过期,需要再"勾选记住密码",重新创建Cookie,但我在今天中午才加载login页面,要"勾选记住密码",也得先显示在login页面不是?!加载着,结果就报了个“400”;运行Debug模式后,发现:@CookieValue注解处理Cookie不当,没有帮我们“当Cookie的用户名、密码为空时”选择‘不管了’,继续往下走,返回login页面,输入框里为空就好了!!!而是直接报错。即,注解@CookieValue发现Cookie有问题,就会直接报错,导致400错误
3、解决
使用index3(),Cookie有效期过了后,会报400,那么我们还是选择使用传统获取Cookie的index2()好了!!!
在LoginController中使用index2(),不用index3()【Cookie里没有用户名、密码,直接return】:
//有index3()方法,可以不用index2(),要是报了400,还是使用传统方法获取Cookie的index2()
@RequestMapping(value="/login",method=RequestMethod.GET)
public String index2(HttpServletRequest request,ModelMap modelmap){
/**
* ModelAndView(传参数和路径)
* 1.返回页面的参数可以通过addObject方法进行设置,相当于调用request.setAttribue方法
* 2.返回页面的URL可以通过setViewName方法设置,但是必须注意的是,页面文件必须与调用的URL地址一致
* 3.ModelAndView一般在方法的内部定义
* 4.方法的返回值必须为ModelAndView
*
* ModelMap(只传路径)
* 1.返回页面的参数可以通过addAttribute方法进行设置,相当于调用request.setAttribue方法
* 2.ModelMap变量一般在方法的参数中定义
* 3.方法的返回值是字符串
* */
// EmpVo empvo=new EmpVo();
// modelmap.addAttribute("emp",empvo);
//设置返回页面
Cookie ck[]=request.getCookies();
if(ck!=null){//判断cookie是否存在
for(int i=0;i<ck.length;i++){
if(ck[i].getName().equals("unameCookie")){
//URLDecoder.decode方法解码,确保中文不会出现乱码
//通过addAttribute方法定义的变量,相当于request.setAttribute定义的变量
modelmap.addAttribute("empName",URLDecoder.decode(ck[i].getValue()));
}
if(ck[i].getName().equals("pwdCookie")){
modelmap.addAttribute("password",URLDecoder.decode(ck[i].getValue()));
}
}
}
return "login";
}