记住密码页面返回时出错400

本文介绍了解决登录界面因未处理“记住密码”功能导致的400错误的方法。通过将变量类型从int改为Integer,使得可以接受null值,并在页面加载时即判断是否选择了记住密码选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:在做登录界面时,如果点击“记住密码”进入下一个页面并后退到登录界面,再点击“登录”并且不点击“记住密码”时,
服务器就会报400错误,原因是第二次登录时由于没对“记住密码”做任何操作,所以isAuto返回的值是null,而int型不能接收null值,就会报错。
“解决办法:把接收变量类型改成integer型,它可以接收null值。
建议:以后接收整型数据时没有特殊情况尽量都用integer。

后续:我在另一个工程中用的integer型接收isAuto的值,发现还是出错,就用了另一种解决办法,就是在页面加载的时候就判断记住密码框有没有被选中。

//jsp页面代码
<label><input type="checkbox" name="isAuto" id="isAuto" onclick="remember()">记住密码</label>

<script type="text/javascript">
    function remember() {
        var isAuto = document.getElementById("isAuto");
        if (isAuto.checked == true) {
            document.getElementById("isAuto").value = "1";
        } else {
            document.getElementById("isAuto").value = "0";
        }
    }
</script>

//出错时代码
public ModelAndView loginIdentify(Model model, HttpSession session,
            @RequestParam(value = "isAuto", defaultValue = "0") int isAuto,
            String username, String password, HttpServletRequest request,
            HttpServletResponse response) throws Exception {...}
//正确时代码
public ModelAndView loginIdentify(Model model, HttpSession session,
            @RequestParam(value = "isAuto", defaultValue = "0") Integer isAuto,
            String username, String password, HttpServletRequest request,
            HttpServletResponse response) throws Exception {...}
这个是我的登录界面代码:<template> <!-- 背景图容器 --> <view class="background-container"> <image class="background-image" src="/static/dlbj.jpg" mode="aspectFill" ></image> <!-- 半透明遮罩 --> <view class="overlay"></view> </view> <!-- 登录表单 --> <view class="login-container"> <view class="login-form"> <text class="login-title">用户登录</text> <input v-model="username" placeholder="用户名" class="login-input" placeholder-class="input-placeholder" /> <input v-model="password" type="password" placeholder="密码" class="login-input" placeholder-class="input-placeholder" /> <!-- 记住密码 --> <view class="remember-section"> <checkbox-group @change="toggleRemember"> <label class="checkbox-label"> <checkbox :checked="remember" color="#3498db" style="transform: scale(0.8);" /> <text>记住账号密码</text> </label> </checkbox-group> <text class="forgot-password" @click="handleForgotPassword">忘记账号密码</text> </view> <button class="login-button" :loading="loading" @click="handleLogin" >登录</button> </view> </view> </template> <script> import { ref,onMounted } from 'vue' import { onShow } from '@dcloudio/uni-app'; export default { setup() { const username = ref('') const password = ref('') const loading = ref(false) const remember = ref(false) // 记住密码状态 // 页面加载检查是否有保存的凭据 onMounted(() => { const savedUsername = uni.getStorageSync('savedUsername') const savedPassword = uni.getStorageSync('savedPassword') if (savedUsername && savedPassword) { username.value = savedUsername password.value = savedPassword remember.value = true } }) // 切换记住密码状态 const toggleRemember = (e) => { remember.value = e.detail.value.length > 0 } // 忘记密码处理 const handleForgotPassword = () => { uni.showModal({ title: '忘记密码', content: '是否清除保存的账号密码?', success: (res) => { if (res.confirm) { // 清除保存的账号密码 uni.removeStorageSync('savedUsername') uni.removeStorageSync('savedPassword') username.value = '' password.value = '' remember.value = false uni.showToast({ title: '已清除账号密码', icon: 'success' }) } } }) } const handleLogin = async () => { // 验证输入 if (!username.value.trim()) { uni.showToast({ title: '请输入用户名', icon: 'none', duration: 2000 }) return } if (!password.value) { uni.showToast({ title: '请输入密码', icon: 'none', duration: 2000 }) return } loading.value = true try { // 兼容性请求 const response = await new Promise((resolve, reject) => { uni.request({ url: 'http://172.26.26.43/dev-api/login', method: 'POST', data: { username: username.value, password: password.value }, header: { 'Content-Type': 'application/json' }, timeout: 10000, success: (res) => resolve(res), fail: (err) => reject(err) }) }) // 处理响应 await handleResponse(response) // 登录成功后保存凭据(如果用户选择了记住密码) if (remember.value) { saveCredentials() } else { clearSavedCredentials() } } catch (error) { console.error('登录请求出错:', error) let errorMsg = '登录失败,请重试' if (error.errMsg) { errorMsg = `请求失败: ${error.errMsg}` } else if (error.message) { errorMsg = error.message } uni.showToast({ title: errorMsg, icon: 'none', duration: 2000 }) } finally { loading.value = false } } // 保存凭据到本地存储 const saveCredentials = () => { uni.setStorageSync('savedUsername', username.value) uni.setStorageSync('savedPassword', password.value) } // 清除保存的凭据 const clearSavedCredentials = () => { uni.removeStorageSync('savedUsername') uni.removeStorageSync('savedPassword') } // 清除token缓存 onShow(() => { uni.removeStorageSync('token'); uni.removeStorageSync('userInfo'); }); const handleResponse = async (response) => { // 检查HTTP状态码 if (response.statusCode < 200 || response.statusCode >= 300) { throw new Error(`服务器错误: ${response.statusCode}`) } // 解析响应数据 const { data } = response if (!data) { throw new Error('服务器返回空数据') } const { code, message, token } = data if (code === 200) { // 存储token uni.setStorageSync('token', token) uni.showToast({ title: '登录成功!', icon: 'success', duration: 1000 }) // 登录成功后跳转 setTimeout(() => { uni.switchTab({ url: '/pages/workbench/workbench' }) }, 1000) } else { throw new Error(`登录失败: ${message || '未知错误'}`) } } // 在登录页面的onShow方法中 onShow(() => { // 清除 token 缓存 uni.removeStorageSync('token'); // 清除其他用户相关数据 uni.removeStorageSync('userInfo'); console.log('已清除登录状态缓存'); // 生产环境可移除 }); return { username, password, remember, loading, handleLogin, toggleRemember, handleForgotPassword } } } </script> 我想要登录成功后保存登录的账户名,显示到我的页面里,我的页面代码:<template> <view class="container"> <!-- 新增:顶部用户信息区域 --> <view class="user-info-section"> <view class="avatar-container"> <image src="/static/images/default-avatar.png" class="avatar-image" mode="aspectFill" /> <view class="avatar-frame"></view> </view> <view class="user-details"> <text class="welcome-text">您好,</text> <text class="username">{{ userName }}</text> <view class="user-meta"> <text class="user-role">{{ userRole }}</text> <text class="user-dept">{{ userDept }}</text> </view> </view> </view> <!-- 搜索表单区域 --> <view class="search-card"> <!-- 原有搜索表单内容保持不变 --> </view> <!-- 数据显示区域 --> <view class="data-card"> <!-- 原有数据展示内容保持不变 --> </view> </view> </template> <script setup> import { ref, reactive, computed, onMounted } from 'vue'; import { onShow } from '@dcloudio/uni-app'; // 新增:用户信息相关 const userName = ref(''); const userRole = ref(''); const userDept = ref(''); // 原有响应式数据保持不变... // 页面显示加载数据 onShow(() => { fetchSurveyData(); fetchBdrList(); loadUserInfo(); // 新增:加载用户信息 }); // 新增:加载用户信息 const loadUserInfo = () => { try { // 从本地存储获取用户信息 const userInfo = uni.getStorageSync('userInfo'); if (userInfo) { // 解析用户信息 userName.value = userInfo.nickName || userInfo.userName || '未知用户'; userRole.value = userInfo.roles?.join('、') || '普通用户'; userDept.value = userInfo.dept?.deptName || '未分配部门'; // 打印调试信息 console.log('用户信息加载成功:', { name: userName.value, role: userRole.value, dept: userDept.value }); } else { console.warn('未找到用户信息,请重新登录'); // 如果没有用户信息,跳转到登录页 uni.redirectTo({ url: '/pages/login/login' }); } } catch (error) { console.error('加载用户信息失败:', error); uni.showToast({ title: '加载用户信息失败', icon: 'none' }); } }; // 原有方法保持不变... </script>
最新发布
08-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值