SSM时遇到的异常(6)下——SSM的400错误(定义与获取Cookie)

版权声明:本文为博主原创文章,未经博主允许不得转载。谢谢合作~ https://blog.csdn.net/qq_41042595/article/details/86138618

  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";
	}

猜你喜欢

转载自blog.csdn.net/qq_41042595/article/details/86138618
ssm